This is an optional step. You can skip it and install packages to your current environment.
python -m venv .venv/histtest
source .venv/histtest/bin/activate
pip install \
numpy==1.19.5 \
plotly==5.5.0 \
jupyter==1.0.0 \
pillow==5.4.1 \
scikit-image==0.14.2 \
pycocotools==2.0.3 \
himpy=0.0.1
import sys
from plotly.subplots import make_subplots
import plotly.graph_objects as go
from himpy.histogram import operations
from himpy.executor import Parser, Evaluator
from himpy.utils import E
%load_ext autoreload
%autoreload 2
# dataset generator
from utils.datasets import ColorImageGenerator
# feature extraction
from utils.feature_extraction import (
FeatureMerger,
ColorSetTransformer,
PositionSetTransformer,
filter_data,
create_histogram,
create_histogram_,
extract_elements,
extract_element_set
)
# search engine
from utils.search_engine import SearchEngine
# plot
from utils.plot.plotly_plot import (
show_color_elements,
plot_position_grid_plotly,
plot_histogram,
show_rank_images
)
# image colors
from utils.feature_extraction.color import COLOR_ELEMENTS, COLOR_ELEMENTS_RGB
image_generator = ColorImageGenerator()
image = image_generator.generate(shape=(100, 100),
steps=(10, 10),
normal_element_ids={"e7", "e9", "e34"},
random_state=123)
fig = make_subplots(rows=1, cols=1, subplot_titles=("Initial Image [RGB]",))
fig.add_trace(go.Image(z=image, hoverinfo="skip"), row=1, col=1)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=250, height=200)
fig.show()
Stucture of color elements:
[
{
"id": id,
"h": [min, max],
"s": [min, max],
"b": [min, max]
}, ...
]
Parameters:
id: identification of an elementh: hue, interval. If you define interval from 230 to 10, it will be divided into two ones: from 230 to 240 and from 0 to 10s: saturation, intervalb: brightness, interval# Show the first five low-level color elements
print("Total number of color elements:", len(COLOR_ELEMENTS))
COLOR_ELEMENTS[:5]
Total number of color elements: 40
({'id': 'e1', 'h': [40, 54], 's': [30, 79], 'b': [20, 59]},
{'id': 'e2', 'h': [40, 54], 's': [80, 159], 'b': [20, 59]},
{'id': 'e3', 'h': [40, 54], 's': [160, 240], 'b': [20, 59]},
{'id': 'e4', 'h': [55, 104], 's': [0, 29], 'b': [60, 159]},
{'id': 'e5', 'h': [55, 104], 's': [30, 79], 'b': [20, 59]})
# Display all low-level color elements
show_color_elements(title="Low-level elements (Color Universal set - Uc)")
# Display all low-level color elements
show_color_elements(element_ids={"e18"}, title="e18")
color_transformer = ColorSetTransformer()
color_image = color_transformer.fit_transform(X=image, y=None)
color_image
array([['e34', 'e34', 'e34', ..., 'e36', 'e36', 'e36'],
['e34', 'e34', 'e34', ..., 'e36', 'e36', 'e36'],
['e34', 'e34', 'e34', ..., 'e36', 'e36', 'e36'],
...,
['e32', 'e32', 'e32', ..., 'e30', 'e30', 'e30'],
['e32', 'e32', 'e32', ..., 'e30', 'e30', 'e30'],
['e32', 'e32', 'e32', ..., 'e30', 'e30', 'e30']], dtype='<U10')
color_image_ = color_transformer.transform_to_int(color_image)
fig = make_subplots(rows=1, cols=2, subplot_titles=("Initial Image [RGB]", "Transformed Image [low-level]"))
common_heatmap_args = {
"zmax": 40,
"zauto": False,
"colorscale": "gray",
"showscale": False,
"hoverinfo": "skip"
}
fig.add_trace(go.Image(z=image, hoverinfo="skip"), row=1, col=1)
fig.add_trace(go.Heatmap(z=color_image_, **common_heatmap_args), row=1, col=2)
fig.update_yaxes(autorange="reversed", constrain="domain", scaleanchor="x", row=1, col=2)
fig.update_xaxes(constrain="domain", scaleanchor="y", row=1, col=2)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=500, height=200)
fig.show()
parser = Parser()
# Definition of high-level positional elements
Ec_green = E("e1+e2+e3+e4+e5+e6+e7+e8+e9+e10+e11+e12+e13+e14+e15+e16+e17+e18+e19+e20")
Ec_yellow_green = E("e2+e3+e21+e22+e23+e24+e25+e26+e27+e28+e29+e30")
Ec_red = E("e31+e32+e33+e34+e35+e36+e37+e38+e39+e40")
Ec_rose = E("e32+e35+e36+e39+e40")
Ecs = [
("green", Ec_green),
("yellow_green", Ec_yellow_green),
("red", Ec_red),
("rose", Ec_rose)
]
# Sets of hight-level color elements (they will be used for the Evaluator below)
Ecs_set = { name: parser.parse_set(Ec.value) for name, Ec in Ecs}
Ecs_set["green"]
{'e1',
'e10',
'e11',
'e12',
'e13',
'e14',
'e15',
'e16',
'e17',
'e18',
'e19',
'e2',
'e20',
'e3',
'e4',
'e5',
'e6',
'e7',
'e8',
'e9'}
# Display all low-level color elements
for title, Ec_set in Ecs_set.items():
show_color_elements(element_ids=Ec_set, title=title)
color_filtered_image = color_transformer.filter_elements(color_image, Ecs_set["green"])
color_data_filtered_image = color_transformer.filter_data(color_image, image, Ecs_set["green"])
color_filtered_image_ = color_transformer.transform_to_int(color_filtered_image)
fig = make_subplots(rows=1, cols=4,
subplot_titles=(
"Initial Image [RGB]",
"Transformed Image [low-level]",
"Element Filter [green]",
"Data Filter [green]"
))
common_heatmap_args = {
"zmax": 40,
"zauto": False,
"colorscale": "gray",
"showscale": False,
"hoverinfo": "skip"
}
fig.add_trace(go.Image(z=image, hoverinfo="skip"), row=1, col=1)
fig.add_trace(go.Heatmap(z=color_image_, **common_heatmap_args), row=1, col=2)
fig.add_trace(go.Heatmap(z=color_filtered_image_, **common_heatmap_args), row=1, col=3)
fig.add_trace(go.Image(z=color_data_filtered_image, hoverinfo="skip"), row=1, col=4)
fig.update_yaxes(autorange="reversed", constrain="domain", scaleanchor="x", row=1, col=2)
fig.update_xaxes(constrain="domain", scaleanchor="y", row=1, col=2)
fig.update_yaxes(autorange="reversed", constrain="domain", scaleanchor="x", row=1, col=3)
fig.update_xaxes(constrain="domain", scaleanchor="y", row=1, col=3)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=800, height=200)
fig.show()
# Grid params: 5 splits along Y, and 5 along X
GRID = (5, 5)
# Create a position transformer
position_transformer = PositionSetTransformer(splits=GRID, element_ndim=3)
# Set an image size
position_transformer.fit(X=image, y=None)
# Build an image in which each pixel defines a position
position_image = position_transformer.transform(X=image)
fig = make_subplots(rows=1, cols=1, subplot_titles=("Position Elements",))
fig = plot_position_grid_plotly(position_transformer, fig, row=1, col=1)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=300, height=200)
fig.show()
color_image_ = color_transformer.transform_to_int(color_image)
fig = make_subplots(rows=1, cols=3,
subplot_titles=(
"Initial Image [RGB]",
"Transformed Image [low-level]",
"Position Elements"
))
common_heatmap_args = {
"zauto": True,
"colorscale": "gray",
"showscale": False,
"hoverinfo": "skip"
}
fig.add_trace(go.Image(z=image, hoverinfo="skip"), row=1, col=1)
fig.add_trace(go.Heatmap(z=position_image, **common_heatmap_args), row=1, col=2)
fig = plot_position_grid_plotly(position_transformer, fig, row=1, col=3)
fig.update_yaxes(autorange="reversed", constrain="domain", scaleanchor="x", row=1, col=2)
fig.update_xaxes(constrain="domain", scaleanchor="y", row=1, col=2)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=900, height=200)
fig.show()
# Definition of high-level positional elements
Ep_top = E("1+2+3+4+5+6+7+8+9+10")
Ep_bottom = E("16+17+18+19+20+21+22+23+24+25")
Ep_left = E("1+2+6+7+11+12+16+17+21+22")
Ep_right = E("4+5+9+10+14+15+19+20+24+25")
Ep_center = E("7+8+9+12+13+14+17+18+19")
Eps = [
("top", Ep_top),
("bottom", Ep_bottom),
("left", Ep_left),
("right", Ep_right),
("center", Ep_center)
]
# Sets of high-level positional elements (they will be used for the Evaluator below)
Eps_set = { name: parser.parse_set(Ep.value) for name, Ep in Eps}
Eps_set["center"]
{'12', '13', '14', '17', '18', '19', '7', '8', '9'}
fig = make_subplots(rows=1, cols=len(Eps_set), subplot_titles=tuple(Eps_set.keys()))
for i, (name, Eps) in enumerate(Eps_set.items()):
fig = plot_position_grid_plotly(position_transformer, fig, element_ids=Eps, row=1, col=i+1)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=len(Eps_set)*150, height=200)
fig.show()
Ep_set_ = Eps_set["center"]
elements_image = position_transformer.filter_elements(position_image, Ep_set_)
filtered_image = position_transformer.filter_data(position_image, image, Ep_set_)
# TODO: plot
# Note: Plotly plot images from bottom left corner. So, images are inversed.
# [::-1,:,:] is used to recover the origin
fig = make_subplots(rows=1, cols=len(Eps_set), subplot_titles=tuple(Eps_set.keys()))
for i, (name, Ep_set) in enumerate(Eps_set.items()):
filtered_image = position_transformer.filter_data(position_image, image, Ep_set)
fig.add_trace(go.Image(z=filtered_image[::-1,:,:], hoverinfo="skip"), row=1, col=i+1)
fig = plot_position_grid_plotly(position_transformer, fig, element_ids=Ep_set, row=1, col=i+1)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=len(Eps_set)*150, height=200)
fig.show()
# Option 1
hist = create_histogram((position_image, color_image))
hist.to_dict()
{('1', 'e34'): 0.01,
('1', 'e7'): 0.02,
('1', 'e9'): 0.01,
('10', 'e17'): 0.01,
('10', 'e31'): 0.01,
('10', 'e7'): 0.02,
('11', 'e1'): 0.01,
('11', 'e3'): 0.01,
('11', 'e31'): 0.01,
('11', 'e34'): 0.01,
('12', 'e20'): 0.01,
('12', 'e22'): 0.01,
('12', 'e26'): 0.01,
('12', 'e33'): 0.01,
('13', 'e31'): 0.01,
('13', 'e34'): 0.01,
('13', 'e35'): 0.01,
('13', 'e9'): 0.01,
('14', 'e14'): 0.01,
('14', 'e32'): 0.01,
('14', 'e39'): 0.02,
('15', 'e27'): 0.01,
('15', 'e34'): 0.02,
('15', 'e37'): 0.01,
('16', 'e26'): 0.01,
('16', 'e33'): 0.01,
('16', 'e7'): 0.01,
('16', 'e9'): 0.01,
('17', 'e12'): 0.01,
('17', 'e3'): 0.01,
('17', 'e7'): 0.02,
('18', 'e25'): 0.01,
('18', 'e37'): 0.01,
('18', 'e6'): 0.01,
('18', 'e9'): 0.01,
('19', 'e17'): 0.01,
('19', 'e22'): 0.01,
('19', 'e34'): 0.01,
('19', 'e9'): 0.01,
('2', 'e27'): 0.01,
('2', 'e7'): 0.01,
('2', 'e9'): 0.02,
('20', 'e13'): 0.01,
('20', 'e22'): 0.02,
('20', 'e38'): 0.01,
('21', 'e15'): 0.01,
('21', 'e32'): 0.01,
('21', 'e34'): 0.01,
('21', 'e9'): 0.01,
('22', 'e23'): 0.01,
('22', 'e31'): 0.01,
('22', 'e35'): 0.01,
('22', 'e7'): 0.01,
('23', 'e10'): 0.01,
('23', 'e12'): 0.01,
('23', 'e15'): 0.01,
('23', 'e26'): 0.01,
('24', 'e29'): 0.01,
('24', 'e35'): 0.02,
('24', 'e7'): 0.01,
('25', 'e19'): 0.01,
('25', 'e25'): 0.01,
('25', 'e30'): 0.01,
('25', 'e4'): 0.01,
('3', 'e18'): 0.01,
('3', 'e22'): 0.01,
('3', 'e7'): 0.01,
('3', 'e9'): 0.01,
('4', 'e3'): 0.01,
('4', 'e34'): 0.01,
('4', 'e36'): 0.01,
('4', 'e7'): 0.01,
('5', 'e11'): 0.01,
('5', 'e34'): 0.01,
('5', 'e36'): 0.01,
('5', 'e9'): 0.01,
('6', 'e3'): 0.01,
('6', 'e6'): 0.01,
('6', 'e7'): 0.01,
('6', 'e9'): 0.01,
('7', 'e34'): 0.01,
('7', 'e39'): 0.01,
('7', 'e7'): 0.01,
('7', 'e9'): 0.01,
('8', 'e19'): 0.01,
('8', 'e2'): 0.01,
('8', 'e25'): 0.01,
('8', 'e5'): 0.01,
('9', 'e1'): 0.01,
('9', 'e21'): 0.01,
('9', 'e28'): 0.01,
('9', 'e37'): 0.01}
# Option 2.a
feature_merger = FeatureMerger()
merged_image = feature_merger.fit_transform((position_image, color_image))
merged_image
rec.array([[( 1, 'e34'), ( 1, 'e34'), ( 1, 'e34'), ..., ( 5, 'e36'),
( 5, 'e36'), ( 5, 'e36')],
[( 1, 'e34'), ( 1, 'e34'), ( 1, 'e34'), ..., ( 5, 'e36'),
( 5, 'e36'), ( 5, 'e36')],
[( 1, 'e34'), ( 1, 'e34'), ( 1, 'e34'), ..., ( 5, 'e36'),
( 5, 'e36'), ( 5, 'e36')],
...,
[(21, 'e32'), (21, 'e32'), (21, 'e32'), ..., (25, 'e30'),
(25, 'e30'), (25, 'e30')],
[(21, 'e32'), (21, 'e32'), (21, 'e32'), ..., (25, 'e30'),
(25, 'e30'), (25, 'e30')],
[(21, 'e32'), (21, 'e32'), (21, 'e32'), ..., (25, 'e30'),
(25, 'e30'), (25, 'e30')]],
dtype=[('f0', 'u1'), ('f1', '<U10')])
# Option 2.b
hist = create_histogram_(merged_image)
hist.to_dict()
{('1', 'e34'): 0.01,
('1', 'e7'): 0.02,
('1', 'e9'): 0.01,
('2', 'e27'): 0.01,
('2', 'e7'): 0.01,
('2', 'e9'): 0.02,
('3', 'e18'): 0.01,
('3', 'e22'): 0.01,
('3', 'e7'): 0.01,
('3', 'e9'): 0.01,
('4', 'e3'): 0.01,
('4', 'e34'): 0.01,
('4', 'e36'): 0.01,
('4', 'e7'): 0.01,
('5', 'e11'): 0.01,
('5', 'e34'): 0.01,
('5', 'e36'): 0.01,
('5', 'e9'): 0.01,
('6', 'e3'): 0.01,
('6', 'e6'): 0.01,
('6', 'e7'): 0.01,
('6', 'e9'): 0.01,
('7', 'e34'): 0.01,
('7', 'e39'): 0.01,
('7', 'e7'): 0.01,
('7', 'e9'): 0.01,
('8', 'e19'): 0.01,
('8', 'e2'): 0.01,
('8', 'e25'): 0.01,
('8', 'e5'): 0.01,
('9', 'e1'): 0.01,
('9', 'e21'): 0.01,
('9', 'e28'): 0.01,
('9', 'e37'): 0.01,
('10', 'e17'): 0.01,
('10', 'e31'): 0.01,
('10', 'e7'): 0.02,
('11', 'e1'): 0.01,
('11', 'e3'): 0.01,
('11', 'e31'): 0.01,
('11', 'e34'): 0.01,
('12', 'e20'): 0.01,
('12', 'e22'): 0.01,
('12', 'e26'): 0.01,
('12', 'e33'): 0.01,
('13', 'e31'): 0.01,
('13', 'e34'): 0.01,
('13', 'e35'): 0.01,
('13', 'e9'): 0.01,
('14', 'e14'): 0.01,
('14', 'e32'): 0.01,
('14', 'e39'): 0.02,
('15', 'e27'): 0.01,
('15', 'e34'): 0.02,
('15', 'e37'): 0.01,
('16', 'e26'): 0.01,
('16', 'e33'): 0.01,
('16', 'e7'): 0.01,
('16', 'e9'): 0.01,
('17', 'e12'): 0.01,
('17', 'e3'): 0.01,
('17', 'e7'): 0.02,
('18', 'e25'): 0.01,
('18', 'e37'): 0.01,
('18', 'e6'): 0.01,
('18', 'e9'): 0.01,
('19', 'e17'): 0.01,
('19', 'e22'): 0.01,
('19', 'e34'): 0.01,
('19', 'e9'): 0.01,
('20', 'e13'): 0.01,
('20', 'e22'): 0.02,
('20', 'e38'): 0.01,
('21', 'e15'): 0.01,
('21', 'e32'): 0.01,
('21', 'e34'): 0.01,
('21', 'e9'): 0.01,
('22', 'e23'): 0.01,
('22', 'e31'): 0.01,
('22', 'e35'): 0.01,
('22', 'e7'): 0.01,
('23', 'e10'): 0.01,
('23', 'e12'): 0.01,
('23', 'e15'): 0.01,
('23', 'e26'): 0.01,
('24', 'e29'): 0.01,
('24', 'e35'): 0.02,
('24', 'e7'): 0.01,
('25', 'e19'): 0.01,
('25', 'e25'): 0.01,
('25', 'e30'): 0.01,
('25', 'e4'): 0.01}
hist_elements = sorted(hist.hist_elements().items(), key=lambda x: int(x[0][1].lstrip("e")))
elements = ["({})".format(",".join(el[0])) for el in hist_elements]
values = [el[1].value for el in hist_elements]
colors = ["rgb{}".format(COLOR_ELEMENTS_RGB[el[0][1]]) for el in hist_elements]
fig = make_subplots(rows=1, cols=2, column_widths=[0.2, 0.8], subplot_titles=("Image", "Histogram"))
fig.add_image(z=image, row=1, col=1, name="image")
fig.add_bar(x=elements, y=values, marker_color=colors, width=0.5, row=1, col=2, name="histogram")
fig.update_xaxes(gridcolor='#bdbdbd', title="Elements", titlefont=dict(color="grey"), row=1, col=2)
fig.update_yaxes(gridcolor='#bdbdbd', title="Counts", titlefont=dict(color="grey"), row=1, col=2)
fig.update_layout(plot_bgcolor='#fefefe', showlegend=False, height=300, width=900, title_text="Initial Data")
fig.show()
high_level_elements = {
# position
0: Eps_set,
# color
1: Ecs_set
}
# Initialize an evaluator
evaluator = Evaluator(operations, hist, high_level_elements=high_level_elements)
E1 = E("top", "green")
E2 = E("right", "red")
E1_expr = parser.parse_string(E1.value)
HE1 = evaluator.eval(E1_expr)
print("Expression for E1:\n{}".format(E1.value))
print("\nThe parsed expressino for E1 in the postfix notation:\n{}".format(E1_expr))
print("\nHistogram of E1 given the image:\n{}".format(HE1.to_dict()))
print("\nValue of presence for E1:\n{}".format(HE1.sum()))
Expression for E1:
(top,green)
The parsed expressino for E1 in the postfix notation:
[('top', 'green')]
Histogram of E1 given the image:
{('4', 'e3'): 0.01, ('3', 'e18'): 0.01, ('8', 'e5'): 0.01, ('6', 'e6'): 0.01, ('1', 'e9'): 0.01, ('3', 'e7'): 0.01, ('2', 'e9'): 0.02, ('6', 'e7'): 0.01, ('9', 'e1'): 0.01, ('7', 'e9'): 0.01, ('8', 'e2'): 0.01, ('8', 'e19'): 0.01, ('10', 'e17'): 0.01, ('1', 'e7'): 0.02, ('3', 'e9'): 0.01, ('5', 'e9'): 0.01, ('4', 'e7'): 0.01, ('7', 'e7'): 0.01, ('2', 'e7'): 0.01, ('6', 'e9'): 0.01, ('10', 'e7'): 0.02, ('5', 'e11'): 0.01, ('6', 'e3'): 0.01}
Value of presence for E1:
0.26
E2_expr = parser.parse_string(E2.value)
HE2 = evaluator.eval(E2_expr)
print("Expression for E2:\n{}".format(E2.value))
print("\nThe parsed expressino for E2 in the postfix notation:\n{}".format(E2_expr))
print("\nHistogram of E2 given the image:\n{}".format(HE2.to_dict()))
print("\nValue of presence for E2:\n{}".format(HE2.sum()))
Expression for E2:
(right,red)
The parsed expressino for E2 in the postfix notation:
[('right', 'red')]
Histogram of E2 given the image:
{('19', 'e34'): 0.01, ('5', 'e36'): 0.01, ('4', 'e34'): 0.01, ('14', 'e39'): 0.02, ('15', 'e37'): 0.01, ('5', 'e34'): 0.01, ('4', 'e36'): 0.01, ('15', 'e34'): 0.02, ('20', 'e38'): 0.01, ('14', 'e32'): 0.01, ('24', 'e35'): 0.02, ('9', 'e37'): 0.01, ('10', 'e31'): 0.01}
Value of presence for E2:
0.16
def show_histogram_elements(image, merged_image, HE, title):
E_set = extract_element_set(HE, 2)
E_image = filter_data(image, merged_image, HE.elements())
hist_elements = sorted(HE.to_dict().items(), key=lambda x: int(x[0][1].lstrip("e")))
elements = ["({})".format(",".join(el[0])) for el in hist_elements]
values = [el[1] for el in hist_elements]
colors = ["rgb{}".format(COLOR_ELEMENTS_RGB[el[0][1]]) for el in hist_elements]
fig = make_subplots(rows=1, cols=2, column_widths=[0.2, 0.8],
subplot_titles=("Image<br> {}".format(title), "Histogram: {}".format(title)))
fig.add_image(z=E_image, row=1, col=1, name="image")
fig = plot_histogram(elements=elements, values=values, colors=colors, fig=fig, row=1, col=2)
image_axes_args = {
"showticklabels": False,
"showline": True,
"linewidth": 1,
"linecolor": "black",
"mirror": True
}
fig.update_xaxes(row=1, col=1, **image_axes_args)
fig.update_yaxes(row=1, col=1, **image_axes_args)
fig.update_layout(
margin=dict(l=40, r=40, t=40, b=20),
plot_bgcolor="#fefefe", showlegend=False,
height=300, width=900)
fig.show()
show_histogram_elements(image, merged_image, HE1, E1.value)
show_histogram_elements(image, merged_image, HE2, E2.value)
# Expression with union
E_union = E1 + E2
# Parsed expression
E_union_expr = parser.parse_string(E_union.value)
# Calculate histogram value
HE_union = evaluator.eval(E_union_expr)
print("Expression for E_union:\n{}".format(E_union))
print("\nThe parsed expression for E_union in the postfix notation:\n{}".format(E_union_expr))
print("\nHistogram of E_union given the image:\n{}".format(HE_union.to_dict()))
print("\nValue of presence for E_union:\n{}".format(HE_union.sum()))
Expression for E_union:
((top,green)+(right,red))
The parsed expression for E_union in the postfix notation:
[('top', 'green'), ('right', 'red'), '+']
Histogram of E_union given the image:
{('4', 'e3'): 0.01, ('10', 'e17'): 0.01, ('3', 'e18'): 0.01, ('8', 'e5'): 0.01, ('1', 'e7'): 0.02, ('6', 'e6'): 0.01, ('3', 'e9'): 0.01, ('5', 'e9'): 0.01, ('15', 'e37'): 0.01, ('1', 'e9'): 0.01, ('3', 'e7'): 0.01, ('14', 'e32'): 0.01, ('24', 'e35'): 0.02, ('4', 'e7'): 0.01, ('9', 'e37'): 0.01, ('2', 'e9'): 0.02, ('6', 'e7'): 0.01, ('9', 'e1'): 0.01, ('7', 'e7'): 0.01, ('19', 'e34'): 0.01, ('2', 'e7'): 0.01, ('6', 'e9'): 0.01, ('10', 'e7'): 0.02, ('5', 'e36'): 0.01, ('7', 'e9'): 0.01, ('8', 'e2'): 0.01, ('4', 'e34'): 0.01, ('14', 'e39'): 0.02, ('6', 'e3'): 0.01, ('5', 'e34'): 0.01, ('4', 'e36'): 0.01, ('15', 'e34'): 0.02, ('20', 'e38'): 0.01, ('5', 'e11'): 0.01, ('8', 'e19'): 0.01, ('10', 'e31'): 0.01}
Value of presence for E_union:
0.42000000000000015
show_histogram_elements(image, merged_image, HE1, E1.value)
show_histogram_elements(image, merged_image, HE2, E2.value)
show_histogram_elements(image, merged_image, HE_union, E_union.value)
operation_list = [
# set operations
("union", "+", E1 + E2),
("intersection", "*", E1 * E2),
("substraction", "-", E1 - E2), # or exception, or E1.Sub(E2)
# logic operations
("and", "&", E1 & E2), # or E1.And(E2)
("or", "|", E1 | E2), # or E1.Or(E2)
("xor", "^", E1 ^ E2), # or E1.Xor(E2)
("xsubstraction", "Xsub", E1.Xsub(E2)),
]
for op_name, op_sign, op in operation_list:
E_expr = parser.parse_string(op.value)
HE = evaluator.eval(E_expr)
print("{:12}{:^12}{:10}".format("Operation", "Sign", "Result"))
print("{}".format("-"*34))
print("{:12}{:^12}{:.5f}".format(op_name, op_sign, HE.sum()))
show_histogram_elements(image, merged_image, HE1, E1.value)
show_histogram_elements(image, merged_image, HE2, E2.value)
show_histogram_elements(image, merged_image, HE, op.value)
Operation Sign Result ---------------------------------- union + 0.42000
Operation Sign Result ---------------------------------- intersection * 0.00000
Operation Sign Result ---------------------------------- substraction - 0.26000
Operation Sign Result ---------------------------------- and & 0.16000
Operation Sign Result ---------------------------------- or | 0.42000
Operation Sign Result ---------------------------------- xor ^ 0.26000
Operation Sign Result ---------------------------------- xsubstraction Xsub 0.00000
# Images with normal distrubited some elements
images = [
image_generator.generate(
shape=(100, 100),
steps=(10, 10),
normal_element_ids={"e33", "e34"},
random_state=i+100)
for i in range(100)
]
# Images with uniform distributed elements
images += [
image_generator.generate(
shape=(100, 100),
steps=(10, 10))
for i in range(100)
]
# Create histograms for the images
hists = list()
limit = len(images)
position_image = position_transformer.fit_transform(X=images[0], y=None)
for indx, image in enumerate(images):
# position_image = position_transformer.fit_transform(shape=image.shape[:-1])
color_image = color_transformer.fit_transform(X=image, y=None)
hist = create_histogram((position_image, color_image))
hists.append((indx, hist))
print("\rCurrent image index: {}/{}".format(indx + 1, limit), end="")
Current image index: 200/200
# Initialize a search engine
search_engine = SearchEngine(hists, parser, evaluator)
TOP_N = 20
# Elements
E1 = E("top", "green")
E2 = E("right", "red")
# TODO: show E1 = E("*", "green")
# Define your query
query = E1 & E2
# Retrieve images using the query
ranked_images = search_engine.retrieve(query, topN=TOP_N)
print("Total retrieved images:", len(ranked_images))
ranked_images[:5]
Total retrieved images: 20
[(38, 0.22000000000000006), (15, 0.22), (56, 0.22), (27, 0.21000000000000005), (35, 0.21000000000000005)]
fig = show_rank_images(images, ranked_images, limit=TOP_N,
title="Top {}: <b>{}</b>".format(TOP_N, query.value))
fig.show()
# Generate a new sample image
sample_image = image_generator.generate(
shape=(100, 100),
steps=(10, 10),
normal_element_ids={"e33", "e34"},
random_state=1)
fig = make_subplots(rows=1, cols=1, subplot_titles=("Sample Image",))
fig.add_trace(go.Image(z=sample_image, hoverinfo="skip"), row=1, col=1)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=200, height=200)
fig.show()
# Transform the image to histogram
position_image = position_transformer.fit_transform(X=sample_image)
color_image = color_transformer.transform(sample_image)
sample_hist = create_histogram((position_image, color_image))
# Retrieve images similar to the sample
ranked_images__sample = search_engine.retrieve(sample_hist, topN=TOP_N)
print("Total retrieved images:", len(ranked_images__sample))
ranked_images__sample[:5]
Total retrieved images: 20
[(36, 0.30000000000000004), (59, 0.30000000000000004), (64, 0.30000000000000004), (25, 0.29000000000000004), (38, 0.29000000000000004)]
fig = make_subplots(rows=1, cols=1, subplot_titles=("Sample Image",))
fig.add_trace(go.Image(z=sample_image, hoverinfo="skip"), row=1, col=1)
fig.update_yaxes(showticklabels=False)
fig.update_xaxes(showticklabels=False)
fig.update_layout(margin=dict(l=20, r=20, t=40, b=20), width=200, height=200)
fig.show()
fig = show_rank_images(images, ranked_images__sample,
limit=TOP_N, title="Top {}: <b>Sample Image</b>".format(TOP_N))
fig.show()